package Thread.BlockingQueue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
//借助阻塞队列的特性实现生产者消费者模型
/*生产者消费者模型的两个特性
（1）解耦合
（2）削峰填谷
应对峰值（突如其来的流量激增）
峰值：就是瞬间大量数据产生，如：秒杀，游戏，聊天室
削峰填谷：就是把瞬间大量数据处理成小批量数据处理
代价
（1）更多的硬件机器成本
（2）通信的时间会增加
*/
public class Demo33 {

    public static void main(String[] args) {
        BlockingQueue<Integer> queue=new ArrayBlockingQueue<>(1000);
        //生产者线程
        Thread t1=new Thread(()->{
            int i=1;
            while (true){
                try {
                    queue.put(i);
                    System.out.println("生产元素 "+i);
                    i++;
                    //让生产者慢一点。消费者快一点，每生产一个休息一秒
                    //虽然消费者没有写任何的sleep，但是因为阻塞队列效果，就会使得生产者和消费者同步
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        //消费者线程
        Thread t2=new Thread(()->{
            while (true){
                try {
                    Integer i=queue.take();
                    System.out.println("消费元素 "+i);
                    //给消费者加上sleep，让消费慢点
                    //Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t1.start();
        t2.start();
    }
}
